package com.lap.framework.dto.result;

import com.lap.framework.enums.SystemCode;

/**
 *
 *
 * <pre>
 * 内部状态码规范，内部状态会关系着告警需要，需要认真定制
 *  <ul>
 *    <li>内部状态码由四位组成:[系统标识][模块编号][错误类型][具体错误]</li>
 *    <li>系统标识:错误码所属系统</li>
 *    <li>模块编号:错误码所属模块，应该在系统开发前统一定制</li>
 *    <li>错误类型:需要告警的级别，[错误类型]={P0=级别很高/发送告警,P1=级别中等/发送邮件,P2=级别低/忽略}</li>
 *    <li>例如：SYS-AUTH-P1-0001 表示认证模块的权限错误。</li>
 *  </ul>
 *  <ol>
 *
 *  <li>不需要关注对外返回错误码,默认 451</li>
 *
 * {@code
 * public enum OrderErrors implements Message {
 *     ORDER_REPEAT("TRADE-ORDER-P3-0001","订单重复")
 *     ;
 *     private final String internalCode;
 *
 *     private final String messageKey;
 *
 *     BizMessage(String internalCode, String messageKey) {
 *          this.internalCode = internalCode;
 *          this.messageKey = messageKey;
 *     }
 * }
 * }
 *
 *  <li>关注对外返回错误码</li>
 *
 * {@code
 * public enum OrderErrors implements Message {
 *     ORDER_REPEAT(540,"TRADE-ORDER-P3-0001","订单重复")
 *     ;
 *
 *     private final int externalCode;
 *
 *     private final String internalCode;
 *
 *     private final String messageKey;
 *
 *     OrderErrors(String internalCode, String messageKey) {
 *          this.externalCode = externalCode;
 *          this.internalCode = internalCode;
 *          this.messageKey = messageKey;
 *     }
 * }
 * }
 *  </ol>
 * </pre>
 *
 * @author Shuisheng Lao(劳水生)
 * @version 0.0.1
 * @see SystemCode
 */
public interface ErrorCode {

  /**
   * 获取默认外部状态码，提供业务校验，业务校验用的多。
   *
   * @return 外部状态码
   */
  default int getExternalCode() {
    return 451;
  }

  /**
   * 获取内部状态码
   *
   * @return 状态码
   */
  String getInternalCode();

  /**
   * 获取国际化key
   *
   * @return 国际化key
   */
  String getMessageKey();
}
